package com.xq.factory;

import com.xq.dao.UserDao;
import com.xq.dao.impl.UserDaoImpl;
import com.xq.service.UserService;
import com.xq.service.impl.UserServiceImpl;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @author xq
 * @version 1.0
 * @date 2021/4/5 15:29
 * @description 生产对象（工厂模式）
 */
public class BeanFactory {
    public static Properties properties = null;

    static {
        properties = new Properties();
        // 从bean.properties文件获取输出流
        InputStream is = BeanFactory.class.getClassLoader()
                .getResourceAsStream("bean.properties");
        try {
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取用户业务接口层的对象
     *
     * @return
     */
    public static UserService getUserService() {
        return new UserServiceImpl();
    }

    /**
     * 获取用户数据层的对象
     *
     * @return
     */
    public static UserDao getUserDao() {
        return new UserDaoImpl();
    }

    /**
     * 通过类的全名反射创建对象
     * @param cls 类的全路径，比如com.xq.action.UserAction
     * @param <T> 类型
     * @return 返回对象
     */
    public static <T> T getBean(String cls) {
        T t = null;
        // 把类加载加载到内存里面
        try {
            Class<?> clsObj = Class.forName(cls);
            t = (T) clsObj.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }

    /**
     * 通过类名反射创建对象
     * @param key 类的名字，比如UserService
     * @param <T> 类型
     * @return 返回对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBeanProp(String key) {
        T t = null;
        // 把类加载加载到内存里面
        try {
            Class<?> clsObj = Class.forName(properties.getProperty(key));
            t = (T) clsObj.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }
}
